#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<errno.h>

//命名管道
int main()
{
  umask(0);
  //mkfifo函数创建命名管道
  int ret=mkfifo("./test.fifo",0664);

  if(ret<0&&errno!=EEXIST)
  {
    perror("mkfifo error");
    return -1;
  }
  //以只读的方式打开管道文件./test.fifo
  int fd=open("./test.fifo",O_RDONLY);
  if(fd<0)
  {
    perror("open error");
    return -1;
  }

  while(1)
  {
    char buf[1024]={0};
    //将管道文件./test.fifo中的数据读入到buf中
    int ret=read(fd,buf,1023);
    if(ret<0)
    {
      //如果读入数据失败，则关闭文件并返回
      perror("read error");
      close(fd);
      return -1;
    }
    //read函数返回实际读出的字节数
    //如果管道文件中没有数据，则说明read函数读出字节数为0，也就是返回值ret等于0
    else if(ret==0)
    {
      printf("所有写端已经关闭\n");
      close(fd);
      return -1;
    }
    //读取到数据，打印数据
    printf("%s\n",buf);
  }
  close(fd);
  return 0;
}
